<?php

// TCP 服务端
use Swoole\Server;

class TCPServer
{
    private $server;

    public function __construct($port = 9511)
    {
        $this->server = new Swoole\Server('127.0.0.1', $port);
        // 设置参数
        $this->server->set([
            'worker_num'    => 4,// 进程数, cpu 核心数的 2 或 4 倍
            'max_request'   => 50,// 最大请求数
        ]);
        // 监听事件
        $this->server->on('Connect', [$this, 'onConnect']);
        $this->server->on('Receive', [$this, 'onReceive']);
        $this->server->on('Close', [$this, 'onClose']);
        // 启动服务
        $this->server->start();
    }

    /**
     * 服务端连接事件
     * @param Server $server TCP异步服务端对象
     * @param int $fd 客户端连接标识
     */
    public function onConnect(Swoole\Server $server, $fd)
    {
        echo '连接成功, 客户端ID: ' . $fd . PHP_EOL;
    }

    /**
     * 服务端接收消息事件
     * @param Server $server TCP异步服务端对象
     * @param int $fd 客户端连接标识
     * @param $reactor_id
     * @param mixed $data 接收到的数据
     */
    public function onReceive(Swoole\Server $server, $fd, $reactor_id, $data)
    {
        echo '收到客户端 ' . $fd . ' 数据: ' . $data . PHP_EOL;
        $server->send($fd, '收到数据: ' . $data . PHP_EOL);
    }

    /**
     * 服务端关闭连接事件
     * @param Server $server TCP异步服务端对象
     * @param int $fd 客户端连接标识
     */
    public function onClose(Swoole\Server $server, $fd)
    {
        echo '关闭连接, 客户端ID: ' . $fd . PHP_EOL;
        $server->close($fd);
    }
}